from runtime.flow import ListDataFlow, ScriptDef, FileItem
from lib import excel
from lib.log import logger

class Mail(object):
    mail: str # 邮箱
    name: str # 姓名
    text: str # 发送内容

    def __str__(self):
        return f"{self.mail}"
    
class SendMail(ListDataFlow):
    def __init__(self, excel_file):
        self.excel_file = excel_file

    def load_list(self):
        # 这里负责加载要处理的任务数据,一般是加载表格, 返回的Item类的定义注意一样要实现自己的__str__方法, 
        # 返回可以明确描述任务的信息
        # 上层的框架代码在记录出错记录时直接str(item)的
        return excel.load(self.excel_file, Mail, {
            "mail": {"title": "邮箱", "required": True}, 
            "name": {"title": "姓名", "required": True}
        })

    def run_job(self, item):
        # 这里是具体的每一条任务的处理流程,有异常时直接抛出,上层的代码会捕获并记录出错记录
        # send_mail(item.mail, item.text)
        logger.info(f"发送邮件给{item.mail}")

    def reset(self):
        # 这里负责在异常的时候重置状态,比如重新启动浏览器,重新登录等, 确保下一条数据还可以正常执行
        pass

export = ScriptDef(
            cls=SendMail,
            group="DEMO",
            title="批量发送邮件",
            arguments=[
                FileItem(title="表格", name="excel_file"),
            ]   
         )